package impl.sdi.persistence;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.sdi.model.Categoria;
import com.sdi.persistence.CategoriaDao;
import com.sdi.persistence.exception.AlreadyPersistedException;
import com.sdi.persistence.exception.NotPersistedException;
import com.sdi.persistence.exception.PersistenceException;

public class CatJdbcDao implements CategoriaDao {
	
	@Override
	public List<Categoria> getCategorias() {
		
		PreparedStatement ps = null;
		ResultSet rs = null;
		Connection con = null;
		
		List<Categoria> categorias = new ArrayList<Categoria>();

		try {
			// En una implemenntación más sofisticada estas constantes habría 
			// que sacarlas a un sistema de configuración: 
			// xml, properties, descriptores de despliege, etc 
			String SQL_DRV = "org.hsqldb.jdbcDriver";
			String SQL_URL = "jdbc:hsqldb:hsql://localhost";

			// Obtenemos la conexión a la base de datos.
			Class.forName(SQL_DRV);
			con = DriverManager.getConnection(SQL_URL, "sa", "");
			ps = con.prepareStatement("select * from categoria");
			rs = ps.executeQuery();

			while (rs.next()) {
				Categoria cat = new Categoria(rs.getString("NOMBRE"));
				
				
				
				categorias.add(cat);
			}
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			throw new PersistenceException("Driver not found", e);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new PersistenceException("Invalid SQL or database schema", e);
		} finally  {
			if (rs != null) {try{ rs.close(); } catch (Exception ex){}};
			if (ps != null) {try{ ps.close(); } catch (Exception ex){}};
			if (con != null) {try{ con.close(); } catch (Exception ex){}};
		}
		
		return categorias;
	}



	@Override
	public void save(Categoria cat) throws AlreadyPersistedException {
		PreparedStatement ps = null;
		Connection con = null;
		int rows = 0;
		
		try {
			// En una implementación más sofisticada estas constantes habría 
			// que sacarlas a un sistema de configuración: 
			// xml, properties, descriptores de despliege, etc 
			String SQL_DRV = "org.hsqldb.jdbcDriver";
			String SQL_URL = "jdbc:hsqldb:hsql://localhost";

			// Obtenemos la conexión a la base de datos.
			Class.forName(SQL_DRV);
			con = DriverManager.getConnection(SQL_URL, "sa", "");
			ps = con.prepareStatement(
					"insert into categoria (nombre) " +
					"values (?)");
			
			ps.setString(1, cat.getNombre());
			
			
			

			rows = ps.executeUpdate();
			if (rows != 1) {
				throw new AlreadyPersistedException("Mensaje " + cat.getNombre() + " already persisted");
			} 

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			throw new PersistenceException("Driver not found", e);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new PersistenceException("Invalid SQL or database schema", e);
		}
		finally  {
			if (ps != null) {try{ ps.close(); } catch (Exception ex){}};
			if (con != null) {try{ con.close(); } catch (Exception ex){}};
		}
		
	}

	@Override
	public void update(Categoria cat) throws NotPersistedException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void delete(String name) throws NotPersistedException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public Categoria findByName(String name) {
		// TODO Auto-generated method stub
		return null;
	}


}
